package stack;

import java.util.ArrayList;
import java.util.List;
/*
1. 遍历集合
2. 如果我们发现是一个数字, 就直接入数栈
3. 如果发现扫描到是一个符号,  就分如下情况
3.1 如果发现当前的符号栈为 空，就直接入栈
3.2 如果符号栈有操作符，就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符，
就需要从数栈中pop出两个数,在从符号栈中pop出一个符号，
进行运算，将得到结果，入数栈，然后将当前的操作符入符号栈，
如果当前的操作符的优先级大于栈中的操作符， 就直接入符号栈.
4. 当表达式扫描完毕，就顺序的从 数栈和符号栈中pop出相应的数和符号，并运行.
5. 最后在数栈只有一个数字，就是表达式的结果
*/
public class Calculator {
    public static void main(String[] args) {
        String expression = "3+20*6-2";
        List<String> list = expressionToList(expression);
        System.out.println(list);
        ArrayStack numStack = new ArrayStack(20);
        ArrayStack opStack = new ArrayStack(20);
        for (String s :list) {
            if(s.matches("\\d+")) {
                numStack.push(Integer.parseInt(s));
            }else {
                if(opStack.isEmpty()) {
                    opStack.push(s.charAt(0));
                }else {
                    if(priority(s.charAt(0)) > priority(opStack.peek())) {
                        opStack.push(s.charAt(0));
                    }else {
                        int num1 = numStack.pop();
                        int num2 = numStack.pop();
                        int op = opStack.pop();
                        int res = operation(num1, num2, op);
                        numStack.push(res);
                        opStack.push(s.charAt(0));
                    }

                }
            }
        }
        while (!opStack.isEmpty()) {
            int num1 = numStack.pop();
            int num2 = numStack.pop();
            int op = opStack.pop();
            int res = operation(num1, num2, op);
            numStack.push(res);
        }
        System.out.println("运算结果是:"+numStack.pop());
    }
    //将表达式按数和符号拆出来放到list集合中
    public static List<String> expressionToList(String str) {
        List<String> list = new ArrayList();
        for (int i = 0; i < str.length(); i++) {
            char ch1 = str.charAt(i);
            //如果是最后一位或者不是数，直接放到list集合中
            if(i == str.length()-1 || !(ch1>=48&&ch1<=57)) {
                list.add(ch1+"");
            }else {
                //如果是数，要看这个数是不是多位数
                String ch3 = ""+ch1;
                while (true) {
                    if(i == str.length()-1) {
                        list.add(ch3);
                        break;
                    }
                    char ch2 = str.charAt(i+1);
                    if(!(ch2>=48&&ch2<=57)) {
                        list.add(ch3);
                        break;
                    }
                    ch3 = ch3+ch2;
                    i++;
                }

            }

        }
        return list;
    }
    //定义运算符优先级的方法
    public static int priority(int op) {
        if(op == '*' || op == '/') {
            return 1;
        }else if(op == '+' || op == '-') {
            return 0;
        }else {
            throw new RuntimeException("运算符错误");
        }
    }
    //两个数进行运算的方法
    public static int operation(int num1,int num2,int op) {
        int res = -1;
        switch (op) {
            case '+' :
                res = num1+num2;
                break;
            case '-':
                res = num2-num1;
                break;
            case '*':
                res = num1*num2;
                break;
            case '/':
                res = num2/num1;
                break;
        }
        return res;
    }
}
